package com.sakiko.controller;

import com.sakiko.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

// 演示 前端传递 param参数如何接收
@Controller
@ResponseBody
@RequestMapping("param") // equals “/param”
public class ParamController {

    /*
    方案 1: key = value 直接可以在形参列表声明对应的类型和对应名称的变量
        handler(对应类型 形参名, ...)  不论顺序 【接受时的形参名要和 key对应】
        handlerAdaptor -> 参数 -> handler(形参变量 String => null 可以 int age => null Exception)
        注意: note 在接收基本数据类型的时候，设置对应的包装类型！避免前端不传参数， null赋值出现类型转换异常

    方案 2: param类型接收 @RequestParam @Target({ElementType.PARAMETER})
        场景 1: 形参名 不等于 请求参数的 key
        场景 2: 要求某个参数必须传递  400
        场景 3: 参数不传递给予默认值

    方案 3: 将前端传递的 key=value使用实体类接收数据
        步骤 1: 船舰一个实体类，属性名 = key即可  【可以定义属性为集合或数组】
        步骤 2: handler(实体类 对象名)
        注意: 实体类必须包含 setXxx()方法

    方案 4: 一名多值类型接收 hbs=吃&hbs=喝&hbs=拉&hbs=撒&hbs=睡
        步骤 1: 集合或者数组
        步骤 2: 必须添加 @RequestParam [将数据转化成集合再进行接收和赋值！ handlerAdapter进行优化处理]
     */

    // get /param/data1?username=root&password=111&age=18&user_gender=男  handler
    // handlerAdapter -> handler(参数)
    // 简化参数接收！ 记住，所有的参数接收都是利用形参列表 param、path、json、cookie...
//    @GetMapping("data1")
//    public String data1(String username, String password, Integer age) {
//        System.out.println("ParamController.data1");
//        System.out.println("username" + username + "age:" + age + "password" + password);
//        return "你好！【" + username + "】你的年龄是: " + age;
//    }

    // todo: 账号密码必须传递，年龄可以不传递(默认值为 18)
    @GetMapping("data1")
    public String data1(@RequestParam(required = true) String username,
                        @RequestParam String password, // boolean required() default true;
                        @RequestParam(defaultValue = "18") Integer age,
                        @RequestParam(required = false, name = "user_gender") String userGender // 名称不一致
    ) {
        System.out.println("ParamController.data1");
        System.out.println("username" + username + "age:" + age + "password" + password);
        return "param.data1";
    }

    // 需求 2: get /param/data2?name=sakiko&age=16&height=164.5&gender=female
    // 一旦参数超过 3个，监视使用实体类进行参数封装传递！！提高程序健壮性
    @GetMapping("data2")
//    public String data2(String name,Integer age,Double height,String gender) {
    public String data2(User user) { // 还是用的 setXxx 不然属性赋不上值
        System.out.println(user.toString());
        return "param.data2";
    }

    // 需求 3: get /param/data3?hbs=x&hbs=y&hbs=z
//    public String data3(List<String> hbs) { // 500
    @GetMapping("data3")
    public String data3(@RequestParam("hbs") List<String> hbsList) {
        System.out.println(hbsList.toString()); // [x, y, z] 此时正确接收
        return "param.data3";
    }
}
